﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data;
using System.Data.SqlClient;
using XT.Exam.ADO.Net;
using XT.Exam.MODEL;
using XT.Exam.Common;

using XT.Exam.IDataAccess.Base_Inerface;
namespace XT.Exam.ADO.Net
{
   
        public abstract class BaseDataAccess<T> : IBaseDataAccess<T> where T : XT.Exam.MODEL.BaseModel
        {
            /// <summary>
            /// 定义一个抽象的表名
            /// </summary>
            public abstract string TableName { get; }

            /// <summary>
            /// 定义一个抽象的主键
            /// </summary>
            public abstract Dictionary<string, bool> PkName { get; }


            /// <summary>
            /// 添加
            /// </summary>
            /// <param name="t"></param>
            /// <returns></returns>
            public bool Add(T t,params SqlParameter[] parameter)
            {
                string sql = Common.CommonHelp.ClassToSQL(t, TableName, PkName,parameter);

                return DBHelper.GetExecuteNonQuery(sql);
            }
            public bool DeleteById(T t)
            {
                string sql = Common.CommonHelp.ClassTODel(t, TableName, PkName);
                return DBHelper.GetExecuteNonQuery(sql);
            }
            public bool Update(T t)
            {
                string sql = Common.CommonHelp.ClassToUpdate(t, TableName, PkName);
                return DBHelper.GetExecuteNonQuery(sql);
            }
            /// <summary>
            /// 显示
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <returns></returns>
            public List<T> GetList<T>(params SqlParameter[] param) where T : new()
            {
                //            T t5 = new T();

                string sql = Common.CommonHelp.ClassToShow<T>(TableName, param);
                DataTable dt = DBHelper.GetDataSet(sql);
                List<T> t = new List<T>();
                foreach (DataRow item in dt.Rows)
                {
                    Type t1 = typeof(T);
                    #region //Assembly注释
                    //Assembly 反射命名空间下的一个方法
                    // 摘要: 
                    //     获取在其中声明该类型 System.Reflection.Assembly。 对于泛型类型，则获取在其中定义该泛型类型的 System.Reflection.Assembly。
                    // 返回结果: 
                    //     描述包含当前类型的程序集的 System.Reflection.Assembly 实例。 对于泛型类型，该实例描述包含泛型类型定义的程序集，而不是创建和使用特定构造类型的程序集。

                    //CreateInstance() 为指定的类型 创建实例
                    //FullName 查找到其路径 把改类型的属性赋给一个新的实例 
                    #endregion
                    T t2 = (T)t1.Assembly.CreateInstance(t1.FullName);
                    foreach (var i in t1.GetProperties())
                    {
                        #region //注释掉
                        //if (item[i.Name ] != DBNull.Value || item[i.Name ] != null)
                        //{
                        //    if (i.PropertyType == typeof(DateTime))
                        //    {
                        //        i.SetValue(t2, Convert.ToDateTime(item[i.Name ]));
                        //    }
                        //    else
                        //    {
                        //        i.SetValue(t2, Convert.ChangeType(i.PropertyType, item[i.Name ]), null);
                        //    }
                        //}
                        #endregion
                        i.SetValue(t2, item[i.Name]);

                    }
                    t.Add(t2);
                }
                return t;
                #region
                //foreach(DataRow dr in dt.Rows)
                //{
                //    T t = new T();
                //    foreach(var item in t.GetType().GetProperties())
                //    {
                //        if(dr[item.Name]!=DBNull.Value||dr[item.Name]!=null)
                //        {
                //            if(item.PropertyType==typeof(DateTime))
                //            {
                //                item.SetValue(t,Convert.ToDateTime(dr[item.Name]), null);
                //            }
                //            else
                //            {
                //                item.SetValue(t,Convert.ChangeType(dr[item.Name], item.PropertyType), null);
                //            }
                //        }
                //        else
                //        {
                //            item.SetValue(t, null, null);
                //        }
                //    }
                //    list.Add(t);

                //}
                //return list;
                #endregion
            }
        }
    }

